﻿/* Begin Pedro */

#define DEBUG
#define USE_MUTEX
/* End Pedro */

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Xml;
using System.Xml.XPath;
using System.Threading;
using System.Diagnostics;
using GPSWMM;
using Coordenadas;
using LectorXML;
using Microsoft.WindowsCE.Forms;
using Microsoft.WindowsMobile.Forms;
using System.Runtime.InteropServices;
using MapaMovil.CentralFotos;


namespace MapaMovil
{
    public enum Modo
    {
        Desplazamiento, Seleccion, Insercion, Distancia, destinationMode, insertAreaMode, gpsx
    }
    public partial class FormPrincipal : Form
    {
        Graphics g = null;
        Modo modo;
        List<Carro> lista_carros;
        Object o = new Object();
        
        //Thread del control del input de usuario para movimiento
        Thread t;
        ThreadStart ts;

        int ancho, alto, resolucion;  //dimensiones en pixel de la pantalla                   

        //Boolean arr, aba, izq, der,arp, abp, izp, dep; //Controlan el movimiento de las teclas
        Boolean arp, abp, izp, dep; //Controlan el movimiento de las teclas
        public static int niveles = 7; //cantidad de niveles de zoom. Va de 0 a 5.

        int zoomActual = 5;  //Nivel de zoom inicial
        int zoomFoto=1;

        public static double lat_ini = -33.4566241277275; //Coordenadas iniciales de posicionamiento del mapa
        public static double lon_ini = -70.6645312824311; //

        public static LatLong ult_dest= null; //Coordenadas de ultimo destino
        


        public bool empeze = false; // La ocupamos para calcular el tiempo de la bateria
        private bool pediHome = false;
        DateTime time_anterior = DateTime.Now;
        DateTime time_actual = DateTime.Now;
        PuntoDeInteres[] PDIselected;
        Mapa mapa;
        Idioma textos;
        Configuracion config;

        Process serverProcess;

        //int md, mu, mm;
        bool pressed = false;
        //bool released = false;

        /* Nuevo GPS*/
        Gps gps;
        GpsDeviceState device;
        GpsPosition position;

        Thread th_carros;
        ThreadStart ts_carros;
        /* Begin Pedro */

        /* Status variables for the GPS reading thread */
        private EventHandler GPSupdateDataHandler;

        /* To prevent concurrent acces to the GPS. I love this thing. */
#if USE_MUTEX
            private Mutex gpsOwnership;
#endif

        /* Destination (destination Mode) */
        /* Department of Redundancy Department :P */
        private LatLong destinationModeDestination;
        //MenuItem menuItemDestination;
        //private bool showDirections;

        /* Insert Area Mode */
        MenuItem menuItemFinish;
        MenuItem menuItemUndo;
        Stack<LatLong> polygonPoints;

        /* End Pedro */

        /*protected override void OnClosed(EventArgs e)*/

        string url_servicio;
        private Label[] labels_estados,labels_llamado_especifico,labels_llamado_especifico_estados;
        private LinkLabel[] labels_llamados, labels_llamado_especifico_carros;
        int maximosLlamados, pixel_final_llamado_especifico;
        XmlNode xdoc_llamado;
        //private Idioma textos;

        private int zoomIniParaMostrarPDI ;

        //---variables para la foto
         private string imageDirectory;
         private System.Drawing.Image myImg;
         private string localPath;
        //Emergencia actual
         private string emergActual;

        public void close()
        {

            //* Close the Gps port
            gps.Close();
            //base.OnClosed(e);

        }
        /*end g3*/
        /* public FormCarros(string url,Idioma textos) */
        public FormPrincipal()
        {
            
            maximosLlamados = 10;
            pixel_final_llamado_especifico = 0;
            this.ancho = 480;
            this.alto = 748;
            InitializeComponent();
            /* actualizamos los tamaños */

            this.ancho = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width;
            this.alto = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height;
            if (this.CurrentAutoScaleDimensions.Height == 192)
                this.resolucion = 2;
            else
                this.resolucion = 1;

            this.tab.Size = new System.Drawing.Size(ancho, alto);
            this.tabMapa.Size = new System.Drawing.Size(ancho, alto - 18 * resolucion);
            this.tabEstado.Size = new System.Drawing.Size(ancho, alto - 18 * resolucion);
            this.panel_estados.Size = new System.Drawing.Size(ancho, alto - 18 * resolucion);
            this.panel_estados.BackColor = Color.White;
            this.tabLlamados.Size = new System.Drawing.Size(ancho, alto - 18 * resolucion);
            this.panel_llamados.Size = new System.Drawing.Size(ancho, alto - 18 * resolucion);
            this.panel_llamados.BackColor = Color.White;
            this.panel_llamado_especifico.Size = new System.Drawing.Size(ancho, alto - 18 * resolucion);
            this.panel_llamado_especifico.BackColor = Color.White;
            this.tabArchivos.Size = new System.Drawing.Size(ancho, alto - 18 * resolucion);
            this.ClientSize = new System.Drawing.Size(ancho, alto);
            this.tab.Invalidate();
            this.tabMapa.Invalidate();
            this.tabEstado.Invalidate();
            this.tabLlamados.Invalidate();
            this.tabArchivos.Invalidate();
            this.Invalidate();
            /* Terminamos de actualizar los tamanos */
            config = new Configuracion();
            this.textos = new Idioma(config.Idioma());
            this.url_servicio = this.config.url_servicio();
            //this.url_servicio = "http://supernova.dcc.uchile.cl/~emergencia/EjemploNuSoap/server.php";
            //startMicroServWeb();
            g = this.tabMapa.CreateGraphics();
            //g = this.CreateGraphics();
            lista_carros = new List<Carro>();
            this.Text = this.textos.valor("/mensajes/FormMapa/Titulo");
            LatLong latlongInicial = new LatLong();
            //las coordenadas de blanco con beaucheff!
            latlongInicial.Latitud = (config.getCoordsSW().Latitud + config.getCoordsNE().Latitud) / 2;
            latlongInicial.Longitud = (config.getCoordsSW().Longitud + config.getCoordsNE().Longitud) / 2;


            mapa = new Mapa(latlongInicial, zoomActual, g, ancho, alto - 18 * resolucion, config);

            //arp = abp = izp = dep = false;
            ts = new ThreadStart(controlTeclas);
            t = new Thread(ts);
            t.Start();

            ts_carros = new ThreadStart(actualiza_carros);
            th_carros = new Thread(ts_carros);
            th_carros.Start();

            /* BEGIN GPS */
            device = null;
            position = null;
            gps = new Gps();
            GPSupdateDataHandler = new EventHandler(GPSUpdateData);
            gps.DeviceStateChanged += new DeviceStateChangedEventHandler(gps_DeviceStateChanged);
            gps.LocationChanged += new LocationChangedEventHandler(gps_LocationChanged);

            /* END GPS*/

            //showDirections = true;

            menuItemFinish = new MenuItem();
            menuItemFinish.Text = "Cancelar";

            menuItemUndo = new MenuItem();
            menuItemUndo.Text = "Deshacer";

            menuItemFinish.Click += new System.EventHandler(insertAreaFinishClick);
            menuItemUndo.Click += new System.EventHandler(insertAreaUndoClick);

            polygonPoints = new Stack<LatLong>();
            mapa.setPolygonPoints(polygonPoints);

            /* Mutex for controlling access to bluetoothToSerial */
#if USE_MUTEX
                gpsOwnership = new Mutex();
#endif

            /* End Pedro */
            /* end g3*/
            this.Size = new System.Drawing.Size(getX(), getY());

            this.Text = this.textos.valor("/mensajes/FormCarros/Titulo");
            this.boton_actualizar_llamados.Text = this.textos.valor("/mensajes/FormCarros/ActualizarLlamados");
            this.tabLlamados.Text = this.textos.valor("/mensajes/FormCarros/Llamados");
            this.boton_actualizar_estados.Text = this.textos.valor("/mensajes/FormCarros/ActualizarEstados");
            this.boton_actualizar_llamado_especifico.Text = this.textos.valor("/mensajes/FormCarros/ActualizarLlamado");
            this.tabEstado.Text = this.textos.valor("/mensajes/FormCarros/Estados");
            
            //---actualizar llamados
            //MessageBox.Show("llego");
            Cursor.Current = Cursors.WaitCursor;
            rellenaLlamados();

            
            this.boton_actualizar_estados.Text = this.textos.valor("/mensajes/FormCarros/Cargando") + "...";
            this.boton_actualizar_estados.Visible = false;
            this.boton_actualizar_estados.Enabled = false;

            rellenaEstados();
            this.boton_actualizar_estados.Text = this.textos.valor("/mensajes/FormCarros/ActualizarEstados");
            this.boton_actualizar_estados.Visible = true;
            this.boton_actualizar_estados.Enabled = true;
            Cursor.Current = Cursors.Default;
            this.zoomIniParaMostrarPDI = config.getZoomMostrarPDI();

            //Emergencia actual
            this.emergActual = "emer";

            //---atributos para la foto
            this.imageDirectory = this.config.getFotoDir();
            
            this.localPath = this.config.path() + "\\" + this.config.getFotoDir() + "\\";
            mapa.dibujar();
        }


        private void rellenaEstados()
        {
            XmlNodeList listaCarros;
            try
            {
                FactoryCarros factCar= new ConcreteCarros();
                XMLCarros carros = factCar.createCarros(this.url_servicio);

                //XMLCarros carros = new XMLCarros(this.url_servicio);
                listaCarros = carros.listaCarros();
            }
            catch (Exception)
            {
                listaCarros = null;
            }
            if (listaCarros == null)
                return;


            //definir color negro por defecto
            Color clColor = new Color();
            clColor = Color.Black;

            if (labels_estados == null || labels_estados.Length != listaCarros.Count * 3)
            {
                
                this.panel_estados.Controls.Clear();
                labels_estados = new Label[listaCarros.Count * 3];
                this.panel_estados.Controls.Add(this.boton_actualizar_estados);


                //colocar titulo de la tabla
                System.Windows.Forms.Label titulo;
                titulo = new System.Windows.Forms.Label();
                titulo.Font = new Font(FontFamily.GenericSansSerif, 8, FontStyle.Regular);
                titulo.Size = new System.Drawing.Size (200 * resolucion, 15 * resolucion);
                titulo.Name = "titulo";
                titulo.Location = new System.Drawing.Point(3, 3 + (25 * resolucion) * (1));
                titulo.Text = "Carro | Estado | Conductor";
                titulo.BackColor = Color.Blue;
                titulo.ForeColor = Color.White;
                this.panel_estados.Controls.Add(titulo);

                titulo.Invalidate();
                titulo.Refresh();


                //completar los datos en la tabla
                for (int i = 0; i < listaCarros.Count; i++)
                {
                    //asignar el color de acuerdo al tipo de emergencia
                    if (listaCarros[i].SelectNodes("estado")[0].InnerText == "transito")//se retira
                        clColor = Color.Green;
                    else
                        if (listaCarros[i].SelectNodes("estado")[0].InnerText == "6-8") //disponible
                            clColor = Color.Orange;
                        else
                            if (listaCarros[i].SelectNodes("estado")[0].InnerText == "6-3")//en el lugar de la emergencia
                                clColor = Color.Blue;
                            else//cualquier otro caso 
                                clColor = Color.Gray;

                    labels_estados[i] = new System.Windows.Forms.Label();
                    labels_estados[i].Font = new Font(FontFamily.GenericSansSerif, 8, FontStyle.Regular);
                    labels_estados[i].Size = new System.Drawing.Size(40 * resolucion, 15 * resolucion);
                    labels_estados[i].Name = "Carro" + i;
                    labels_estados[i].Location = new System.Drawing.Point(3, 3 + (25 * resolucion) * (i + 2));
                    labels_estados[i].Text = listaCarros[i].SelectNodes("nombre")[0].InnerText;
                    labels_estados[i].ForeColor = clColor;
                    labels_estados[i].Invalidate();
                    labels_estados[i].Refresh();

                    labels_estados[i + listaCarros.Count] = new System.Windows.Forms.Label();
                    labels_estados[i + listaCarros.Count].Font = new Font(FontFamily.GenericSansSerif, 8, FontStyle.Regular);
                    labels_estados[i + listaCarros.Count].Size = new System.Drawing.Size(40 * resolucion, 15 * resolucion);
                    labels_estados[i + listaCarros.Count].Name = "estadoCarro" + i;
                    labels_estados[i + listaCarros.Count].ForeColor = clColor;
                    labels_estados[i + listaCarros.Count].Location = new System.Drawing.Point(6 + (40 * resolucion), 3 + (25 * resolucion) * (i + 2));
                    //labels_estados[i + listaCarros.Count].Text = listaCarros[i].SelectNodes("estado")[0].InnerText;
                    labels_estados[i + listaCarros.Count].Invalidate();
                    labels_estados[i + listaCarros.Count].Refresh();

                    labels_estados[i + (listaCarros.Count * 2)] = new System.Windows.Forms.Label();
                    labels_estados[i + (listaCarros.Count * 2)].Font = new Font(FontFamily.GenericSansSerif, 8, FontStyle.Regular);
                    labels_estados[i + (listaCarros.Count * 2)].Size = new System.Drawing.Size(135 * resolucion, 25 * resolucion);
                    labels_estados[i + (listaCarros.Count * 2)].Name = "estadoCarro" + i;
                    //labels_estados[i + (listaCarros.Count * 2)].Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular);
                    labels_estados[i + (listaCarros.Count * 2)].Location = new System.Drawing.Point(9 + (80 * resolucion), 3 + (25 * resolucion) * (i + 2));
                    labels_estados[i + (listaCarros.Count * 2)].ForeColor = clColor;
                    labels_estados[i + (listaCarros.Count * 2)].Text = listaCarros[i].SelectNodes("conductor")[0].InnerText;
                    labels_estados[i + (listaCarros.Count * 2)].Invalidate();
                    labels_estados[i + (listaCarros.Count * 2)].Refresh();

                    if (listaCarros[i].SelectNodes("estado")[0].InnerText.Trim() == "")
                    {
                        labels_estados[i + listaCarros.Count].ForeColor = clColor;
                        labels_estados[i + listaCarros.Count].Text = "0-9";
                    }
                    else
                    {
                        labels_estados[i + listaCarros.Count].ForeColor = clColor;
                        labels_estados[i + listaCarros.Count].Text = listaCarros[i].SelectNodes("estado")[0].InnerText;
                    }
                      
                    this.panel_estados.Controls.Add(labels_estados[i]);
                    this.panel_estados.Controls.Add(labels_estados[i + listaCarros.Count]);
                    this.panel_estados.Controls.Add(labels_estados[i + (listaCarros.Count * 2)]);
                }

            }
            else
            {

                for (int i = 0; i < listaCarros.Count; i++)
                {
                    labels_estados[i].Text = listaCarros[i].SelectNodes("nombre")[0].InnerText;
                    labels_estados[i].Invalidate();
                    labels_estados[i].Refresh();

                    labels_estados[i + (listaCarros.Count * 2)].Text = listaCarros[i].SelectNodes("conductor")[0].InnerText;
                    labels_estados[i + (listaCarros.Count * 2)].Invalidate();
                    labels_estados[i + (listaCarros.Count * 2)].Refresh();

                    
                    if (listaCarros[i].SelectNodes("estado")[0].InnerText.Trim() == "")
                    {
                        labels_estados[i + listaCarros.Count].ForeColor = clColor;
                        labels_estados[i + listaCarros.Count].Text = "0-9";
                    }
                    else
                    {
                        labels_estados[i + listaCarros.Count].ForeColor = clColor;
                        labels_estados[i + listaCarros.Count].Text = listaCarros[i].SelectNodes("estado")[0].InnerText;
                    }
                    
                    labels_estados[i + listaCarros.Count].Invalidate();
                    labels_estados[i + listaCarros.Count].Refresh();
                }
            }
            this.panel_estados.AutoScroll = true;
            this.panel_estados.Invalidate();
            this.panel_estados.Refresh();
        }



        private void actualizaEstado(object sender, EventArgs e){
            Cursor.Current = Cursors.WaitCursor;
            this.boton_actualizar_estados.Text = this.textos.valor("/mensajes/FormCarros/Cargando")+"...";
            this.boton_actualizar_estados.Visible = false;
            this.boton_actualizar_estados.Enabled = false;
            rellenaEstados();
            this.boton_actualizar_estados.Text = this.textos.valor("/mensajes/FormCarros/ActualizarEstados");
            this.boton_actualizar_estados.Visible = true;
            this.boton_actualizar_estados.Enabled = true;
            Cursor.Current = Cursors.Default;
        }

        private void rellenaLlamados()
        {

            XmlNodeList listaLlamados;
            
            //---invocar al webservices de llamados
            try
            {
                FactoryLlamados factLlamados;
                factLlamados= new ConcreteLlamado();
                XMLLlamados llamados = factLlamados.createLlamado(this.url_servicio);
                //XMLLlamadosLocal llamados = new XMLLlamadosLocal(this.url_servicio);
                listaLlamados = llamados.Llamados();
            }
            catch (Exception)
            {
                listaLlamados = null;
            }
            if (listaLlamados == null)
               return;

            //total de emergencias (<= 10)
            int total = System.Math.Min(maximosLlamados, listaLlamados.Count);
            

            if (labels_llamados == null)
            {   //hay llamados
                labels_llamados = new LinkLabel[maximosLlamados*3];
                this.panel_llamados.Controls.Add(this.boton_actualizar_llamados);
                int inicio = 17*resolucion;

                //crear 10 link labels (10 es el limite)
                for (int i = 0; i < maximosLlamados; i++)
                {
                    labels_llamados[i] = new System.Windows.Forms.LinkLabel();
                    labels_llamados[i].Size = new System.Drawing.Size(ancho-18*resolucion, 15*resolucion);
                    labels_llamados[i].Name = "correlativo" + i;
                    labels_llamados[i].Location = new System.Drawing.Point(3, 3 + inicio);
                    labels_llamados[i].Tag = null; //---tag: aqui se enviará los datos del PDI como objeto para mostrarlo en el mapa
                    labels_llamados[i].Click += new System.EventHandler(this.muestraLlamado2);
                    labels_llamados[i].Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Underline);
                    
                    labels_llamados[i + maximosLlamados] = new System.Windows.Forms.LinkLabel();
                    labels_llamados[i + maximosLlamados].Size = new System.Drawing.Size(ancho - 18 * resolucion, 15 * resolucion);
                    labels_llamados[i + maximosLlamados].Name = "Fecha" + i;
                    labels_llamados[i + maximosLlamados].Location = new System.Drawing.Point(3, 3 + inicio+15*resolucion);
                    labels_llamados[i + maximosLlamados].Tag = null;
                    labels_llamados[i + maximosLlamados].Click += new System.EventHandler(this.muestraLlamado2);
                    labels_llamados[i + maximosLlamados].Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Underline);
                    
                    labels_llamados[i + (maximosLlamados * 2)] = new System.Windows.Forms.LinkLabel();
                    labels_llamados[i + (maximosLlamados * 2)].Size = new System.Drawing.Size(ancho - 18 * resolucion, 15 * resolucion);
                    labels_llamados[i + (maximosLlamados * 2)].Name = "Direccion" + i;
                    labels_llamados[i + (maximosLlamados * 2)].Location = new System.Drawing.Point(3, 3 + inicio+30*resolucion);
                    labels_llamados[i + (maximosLlamados * 2)].Click += new System.EventHandler(this.muestraLlamado2);
                    labels_llamados[i + (maximosLlamados * 2)].Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Underline);
                    labels_llamados[i + (maximosLlamados * 2)].Tag = null;

                    inicio += 55*resolucion;
                    this.panel_llamados.Controls.Add(labels_llamados[i]);
                    this.panel_llamados.Controls.Add(labels_llamados[i + maximosLlamados]);
                    this.panel_llamados.Controls.Add(labels_llamados[i + (maximosLlamados * 2)]);

                    
                }
                
            }

            //---colocar en vacio los textos de todos los linklabel
            for (int i = 0; i < maximosLlamados; i++)
            {
                
                labels_llamados[i].Text = "";
                labels_llamados[i + maximosLlamados].Text = "";
                labels_llamados[i + (maximosLlamados * 2)].Text = "";

            }
            this.panel_llamados.Controls.Clear();
            this.panel_llamados.Controls.Add(boton_actualizar_llamados);

            //---sobreescribir los linklabel con los valores de los llamados obtenidos del webservice
            for (int i = 0; i < total; i++)
            {
                //---crear un objeto Punto de interes para enviarlo a un punto específico del mapa
                Emergencia tmp_pi = null;
                
                string correlativo, fechaAlarma, horaAlarma, acto, clave, lat, lon, direccion, observacion;
                correlativo = listaLlamados[i].SelectNodes("correlativo")[0].InnerText;
                fechaAlarma = listaLlamados[i].SelectNodes("fecha")[0].InnerText;
                horaAlarma = listaLlamados[i].SelectNodes("hora")[0].InnerText;
                acto = listaLlamados[i].SelectNodes("acto")[0].InnerText;
                clave = listaLlamados[i].SelectNodes("clave")[0].InnerText;
                lat = listaLlamados[i].SelectNodes("latitud")[0].InnerText;
                lon = listaLlamados[i].SelectNodes("longitud")[0].InnerText;
                direccion = listaLlamados[i].SelectNodes("direccion")[0].InnerText;
                observacion = listaLlamados[i].SelectNodes("observacion")[0].InnerText;
                

                LatLong tmp_latlon = new LatLong(lat, lon);
                //tmp_pi = new Emergencia(acto, clave, direccion, "file", correlativo, tmp_latlon);
                
                

                //crear el objeto emergencia
                tmp_pi = new Emergencia(correlativo, "", clave, acto, "", true, tmp_latlon, direccion, "","", fechaAlarma, horaAlarma, null, null, new ArrayList(), new ArrayList(), new ArrayList(), "");
                
                //---actualizamos el tag (aqui se enviará los datos para graficar en el mapa)
                labels_llamados[i].Tag = tmp_pi;
                labels_llamados[i].Text = listaLlamados[i].SelectNodes("acto")[0].InnerText + " [" + listaLlamados[i].SelectNodes("clave")[0].InnerText+"]";
                labels_llamados[i].Name = listaLlamados[i].SelectNodes("correlativo")[0].InnerText;

                labels_llamados[i + maximosLlamados].Tag = tmp_pi;
                labels_llamados[i + maximosLlamados].Text = "["+listaLlamados[i].SelectNodes("fecha")[0].InnerText + "] [" + listaLlamados[i].SelectNodes("hora")[0].InnerText+"]";
                labels_llamados[i + maximosLlamados].Name = listaLlamados[i].SelectNodes("correlativo")[0].InnerText;

                labels_llamados[i + (maximosLlamados * 2)].Tag = tmp_pi;
                labels_llamados[i + (maximosLlamados * 2)].Text = listaLlamados[i].SelectNodes("direccion")[0].InnerText;
                labels_llamados[i + (maximosLlamados * 2)].Name = listaLlamados[i].SelectNodes("correlativo")[0].InnerText;
                
                //agregamos al panel de llamados
                this.panel_llamados.Controls.Add(labels_llamados[i]);
                this.panel_llamados.Controls.Add(labels_llamados[i + maximosLlamados]);
                this.panel_llamados.Controls.Add(labels_llamados[i + (maximosLlamados * 2)]);
                
            }//---end for

            //---refrescamos el panel de llamados
            this.panel_llamados.AutoScroll = true;
            this.panel_llamados.Invalidate();
            this.panel_llamados.Refresh();
        }

        private void rellenaLlamados2()
        {
/*
            XmlNodeList listaLlamados;
            //---invocar al webservices de llamados
            try
            {
                MessageBox.Show("entro a rellenallamados2");
                XMLLlamadosSN llamados = new XMLLlamadosSN(this.url_servicio);
                MessageBox.Show("salio a rellenallamados2");
                listaLlamados = llamados.Llamados();
            }
            catch (Exception e)
            {
                listaLlamados = null;
            }
            if (listaLlamados == null)
                return;

            //total de emergencias (<= 10)
            int total = System.Math.Min(maximosLlamados, listaLlamados.Count);


            if (labels_llamados == null)
            {   //hay llamados
                labels_llamados = new LinkLabel[maximosLlamados * 3];
                this.panel_llamados.Controls.Add(this.boton_actualizar_llamados);
                int inicio = 17 * resolucion;

                //crear 10 link labels (10 es el limite)
                for (int i = 0; i < maximosLlamados; i++)
                {
                    labels_llamados[i] = new System.Windows.Forms.LinkLabel();
                    labels_llamados[i].Size = new System.Drawing.Size(ancho - 18 * resolucion, 15 * resolucion);
                    labels_llamados[i].Name = "correlativo" + i;
                    labels_llamados[i].Location = new System.Drawing.Point(3, 3 + inicio);
                    labels_llamados[i].Tag = null; //---tag: aqui se enviará los datos del PDI como objeto para mostrarlo en el mapa
                    labels_llamados[i].Click += new System.EventHandler(this.muestraLlamado2);
                    labels_llamados[i].Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular);

                    labels_llamados[i + maximosLlamados] = new System.Windows.Forms.LinkLabel();
                    labels_llamados[i + maximosLlamados].Size = new System.Drawing.Size(ancho - 18 * resolucion, 15 * resolucion);
                    labels_llamados[i + maximosLlamados].Name = "Fecha" + i;
                    labels_llamados[i + maximosLlamados].Location = new System.Drawing.Point(3, 3 + inicio + 15 * resolucion);
                    labels_llamados[i + maximosLlamados].Tag = null;
                    labels_llamados[i + maximosLlamados].Click += new System.EventHandler(this.muestraLlamado2);
                    labels_llamados[i + maximosLlamados].Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular);

                    labels_llamados[i + (maximosLlamados * 2)] = new System.Windows.Forms.LinkLabel();
                    labels_llamados[i + (maximosLlamados * 2)].Size = new System.Drawing.Size(ancho - 18 * resolucion, 15 * resolucion);
                    labels_llamados[i + (maximosLlamados * 2)].Name = "Direccion" + i;
                    labels_llamados[i + (maximosLlamados * 2)].Location = new System.Drawing.Point(3, 3 + inicio + 30 * resolucion);
                    labels_llamados[i + (maximosLlamados * 2)].Click += new System.EventHandler(this.muestraLlamado2);
                    labels_llamados[i + (maximosLlamados * 2)].Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular);
                    labels_llamados[i + (maximosLlamados * 2)].Tag = null;

                    inicio += 55 * resolucion;
                    this.panel_llamados.Controls.Add(labels_llamados[i]);
                    this.panel_llamados.Controls.Add(labels_llamados[i + maximosLlamados]);
                    this.panel_llamados.Controls.Add(labels_llamados[i + (maximosLlamados * 2)]);


                }

            }

            //---colocar en vacio los textos de todos los linklabel
            for (int i = 0; i < maximosLlamados; i++)
            {

                labels_llamados[i].Text = "";
                labels_llamados[i + maximosLlamados].Text = "";
                labels_llamados[i + (maximosLlamados * 2)].Text = "";

            }
            this.panel_llamados.Controls.Clear();
            this.panel_llamados.Controls.Add(boton_actualizar_llamados);

            //---sobreescribir los linklabel con los valores de los llamados obtenidos del webservice
            for (int i = 0; i < total; i++)
            {
                //---crear un objeto Punto de interes para enviarlo a un punto específico del mapa
                Emergencia tmp_pi = null;

                string correlativo, fechaAlarma, horaAlarma, acto, clave, lat, lon, direccion, observacion;
                correlativo = listaLlamados[i].SelectNodes("correlativo")[0].InnerText;
                fechaAlarma = listaLlamados[i].SelectNodes("fecha")[0].InnerText;
                horaAlarma = listaLlamados[i].SelectNodes("hora")[0].InnerText;
                acto = listaLlamados[i].SelectNodes("acto")[0].InnerText;
                clave = listaLlamados[i].SelectNodes("clave")[0].InnerText;
                lat = listaLlamados[i].SelectNodes("latitud")[0].InnerText;
                lon = listaLlamados[i].SelectNodes("longitud")[0].InnerText;
                direccion = listaLlamados[i].SelectNodes("direccion")[0].InnerText;
                observacion = listaLlamados[i].SelectNodes("observacion")[0].InnerText;

                LatLong tmp_latlon = new LatLong(lat, lon);
                //tmp_pi = new Emergencia(acto, clave, direccion, "file", correlativo, tmp_latlon);

                tmp_pi = new Emergencia(correlativo, "", clave, acto, "", true, tmp_latlon, direccion, "", "", fechaAlarma, horaAlarma, null, null, null, null, null, "");

                //---actualizamos el tag (aqui se enviará los datos para graficar en el mapa)
                labels_llamados[i].Tag = tmp_pi;
                labels_llamados[i].Text = listaLlamados[i].SelectNodes("acto")[0].InnerText + " [" + listaLlamados[i].SelectNodes("clave")[0].InnerText + "]";
                labels_llamados[i].Name = listaLlamados[i].SelectNodes("correlativo")[0].InnerText;

                labels_llamados[i + maximosLlamados].Tag = tmp_pi;
                labels_llamados[i + maximosLlamados].Text = "[" + listaLlamados[i].SelectNodes("fecha")[0].InnerText + "] [" + listaLlamados[i].SelectNodes("hora")[0].InnerText + "]";
                labels_llamados[i + maximosLlamados].Name = listaLlamados[i].SelectNodes("correlativo")[0].InnerText;

                labels_llamados[i + (maximosLlamados * 2)].Tag = tmp_pi;
                labels_llamados[i + (maximosLlamados * 2)].Text = listaLlamados[i].SelectNodes("direccion")[0].InnerText;
                labels_llamados[i + (maximosLlamados * 2)].Name = listaLlamados[i].SelectNodes("correlativo")[0].InnerText;

                //agregamos al panel de llamados
                this.panel_llamados.Controls.Add(labels_llamados[i]);
                this.panel_llamados.Controls.Add(labels_llamados[i + maximosLlamados]);
                this.panel_llamados.Controls.Add(labels_llamados[i + (maximosLlamados * 2)]);

            }//---end for

            //---refrescamos el panel de llamados
            this.panel_llamados.AutoScroll = true;
            this.panel_llamados.Invalidate();
            this.panel_llamados.Refresh();
 */ 
        }
        
        private void actualizaLlamados(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            this.boton_actualizar_llamados.Text = this.textos.valor("/mensajes/FormCarros/Cargando") + "...";
            this.boton_actualizar_llamados.Visible = false;
            this.boton_actualizar_llamados.Enabled = false;
            rellenaLlamados();
            this.boton_actualizar_llamados.Text = this.textos.valor("/mensajes/FormCarros/ActualizarLlamados");
            this.boton_actualizar_llamados.Visible = true;
            this.boton_actualizar_llamados.Enabled = true;
            this.panel_llamados.Show();
            this.panel_llamado_especifico.Hide();
            Cursor.Current = Cursors.Default;
        }

        //private void muestraLlamado2(object sender, EventArgs e, string _lat, string _lon, string _direccion )
        private void muestraLlamado2(object sender, EventArgs e )    
        {
            //---mostrar en el mapa la emergencia segun sus coordenadas
            Cursor.Current = Cursors.WaitCursor;

            //---obtener el objeto(alli viene las coordenadas, dirección, fecha, hora) de la variable tag 
            LinkLabel tmp = (LinkLabel)sender;
            LatLong goToLatLong = new LatLong();
            string idemerg,latemerg, longemerg, direccion;

            //PuntoDeInteres tmppi= new PuntoDeInteres("", "", "", "", "", goToLatLong);
            Emergencia detEmerg = new Emergencia();

            //detEmerg = (PuntoDeInteres)tmp.Tag;
            detEmerg = (Emergencia)tmp.Tag;

            //detEmerg
            idemerg = detEmerg.NroEmergencia;
            latemerg = detEmerg.Ubicacion.Latitud.ToString();
            longemerg = detEmerg.Ubicacion.Longitud.ToString();
            direccion = detEmerg.Direccion;
            
            this.tab.SelectedIndex = 0;

            //---dibujar el punto de la emergencia en el mapa
            LatLong tmp2 = new LatLong(latemerg, longemerg);
            //mapa.zoomActual = 5;
            mapa.irAcoordenadas(tmp2);
            //mapa.EmergencyLatLon = tmp2;
            mapa.EmergencyActual = detEmerg;
            mapa.destino_texto = direccion;
            
            ///seleccionar los grifos mas cercanos a la emergencia
            if (FormPrincipal.ult_dest == null)
            {//es la primera vez que entra
                FormPrincipal.ult_dest = tmp2;

                    //MessageBox.Show(FormPrincipal.ult_dest.Latitud.ToString());
                    //MessageBox.Show(tmp2.Latitud.ToString());
                    //MessageBox.Show("entro");
                    //crear el nuevo formulario
                    Idioma idioma2 = new Idioma(config.Idioma());
                    FormLayers frmRadio2 = new FormLayers(mapa.gruposPDI, mapa.grupoADI, idioma2);

                    frmRadio2.Centro = tmp2;
                    //copiar el ultimo destino en una variable global
                    FormPrincipal.ult_dest = tmp2;
                    frmRadio2.Radio = config.getRadioAccionPDI();
                    //marcar el item radio de accion.
                    frmRadio2.boxes[mapa.gruposPDI.Count + 1].Checked = true;

                    Object se2 = new object();
                    EventArgs ea2 = new EventArgs();

                    //click en seleccionar los PDI cercanos al radio
                    frmRadio2.layerOK_Click(se2, ea2);
                    //le decimos se vaya a esa coordena y en el zoom adecuado
                    mapa.irAcoordenadas(tmp2);
                }
            
            ///

            mapa.DrawEmergSymbol = true;
            mapa.dibujar();

            Cursor.Current = Cursors.Default;
            //obtener la lista de carros 

            Cursor.Current = Cursors.WaitCursor;
            XmlNodeList listaLlamadoCars;
            //---invocar al webservices de llamados
            try
            {
                FactoryLlamadoCarros factLlamadoCarros;
                factLlamadoCarros = new ConcreteLlamadoCarros();
                XMLLlamadoCarros llamadocarros = factLlamadoCarros.createLlamadoCarros(this.url_servicio);
                //XMLLlamadosLocal llamados = new XMLLlamadosLocal(this.url_servicio);
                //MessageBox.Show(idemerg);
                listaLlamadoCars = llamadocarros.LlamadoCars(idemerg);
                //MessageBox.Show( listaLlamadoCars.Count.ToString());
            }
            catch (Exception ee)
            {
                listaLlamadoCars = null;
            }
            if (listaLlamadoCars == null)
                return;

            //tenemos Una lista de carros asignados a la emergencia)
            int total =listaLlamadoCars.Count;
            
            //MessageBox.Show(listaLlamadoCars[0].SelectSingleNode("nombrecarro").InnerText);
            detEmerg.CarrosDespachados = listaLlamadoCars;
            
            detEmerg.ProcesarDetalleEmergencia();
            Cursor.Current=Cursors.Default;

            //mostrar un message box
            //MessageBox.Show(detEmerg.ToString());

            detEmerg.MostrarEnPanel();

            //asignar como emergencia activa en el programa principal
            this.emergActual = detEmerg.NroEmergencia;

            
         }

        private void muestraLlamado(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            LinkLabel tmp = (LinkLabel)sender;
            this.boton_actualizar_llamado_especifico.Name = tmp.Name;
            this.panel_llamado_especifico.AutoScroll = true;
            xdoc_llamado = null;

            try
            {
                XMLLlamadosLocal llamado = new XMLLlamadosLocal(this.url_servicio);
                xdoc_llamado = llamado.Llamado(tmp.Name);
            }
            catch (Exception)
            {
                xdoc_llamado = null;
                Cursor.Current = Cursors.Default;
            }
            if (xdoc_llamado == null)
            {
                Cursor.Current = Cursors.Default;
                return;
            }
                XmlNodeList carrosDespachados = xdoc_llamado.SelectNodes("/despachados/carro");
                int cantidadCarros = carrosDespachados.Count;
                /* si no se habian creado los labels de los datos un llamado*/
                this.boton_actualizar_llamados.Text = this.textos.valor("/mensajes/FormCarros/VerLlamados");
                this.panel_llamado_especifico.Controls.Add(this.boton_actualizar_llamado_especifico);
                this.panel_llamado_especifico.Controls.Add(this.boton_actualizar_llamados);
                if (labels_llamado_especifico == null)
                {   // Mostramos solo 10
                    labels_llamado_especifico = new Label[3];
                    int inicio = 35*resolucion;
                    for (int i = 0; i < 3; i++)
                    {
                        labels_llamado_especifico[i] = new System.Windows.Forms.LinkLabel();
                        labels_llamado_especifico[i].Size = new System.Drawing.Size(ancho-18+resolucion, 15*resolucion);
                        labels_llamado_especifico[i].Name = "Llamado" + i;
                        labels_llamado_especifico[i].Location = new System.Drawing.Point(3, 3 + inicio + (15 * resolucion * i));
                        labels_llamado_especifico[i].Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular);
                        labels_llamado_especifico[i].ForeColor = Color.Black;
                        this.panel_llamado_especifico.Controls.Add(labels_llamado_especifico[i]);
                    }
                }
                labels_llamado_especifico[2].Size = new System.Drawing.Size(ancho - 18 * resolucion, 25 * resolucion);
                labels_llamado_especifico[2].Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular);
                
                labels_llamado_especifico[0].Text = xdoc_llamado.SelectNodes("/tipo")[0].InnerText + " " + xdoc_llamado.SelectNodes("/detalle")[0].InnerText;
                labels_llamado_especifico[1].Text = xdoc_llamado.SelectNodes("/fecha")[0].InnerText + " " + xdoc_llamado.SelectNodes("/hora")[0].InnerText;
                labels_llamado_especifico[2].Text = xdoc_llamado.SelectNodes("/sector")[0].InnerText + " " + xdoc_llamado.SelectNodes("/direccion")[0].InnerText;
                // Quedamos en el pixel 90
                /* Ahora nos preocopucamos de link label de los carros
                 * Si es nulo o los carros que había son menores a los que hay realmente
                 */
                if (labels_llamado_especifico_carros == null)
                {
                    labels_llamado_especifico_carros = new LinkLabel[cantidadCarros];
                    int inicio = 101 * resolucion;
                    for (int i = 0; i < cantidadCarros; i++)
                    {
                        /* Caben 11 por fila */
                        if (i % 7 == 0 && i != 0)
                            inicio += 15;
                        labels_llamado_especifico_carros[i] = new System.Windows.Forms.LinkLabel();
                        labels_llamado_especifico_carros[i].Size = new System.Drawing.Size(30 * resolucion, 15 * resolucion);
                        labels_llamado_especifico_carros[i].Name = carrosDespachados[i].SelectNodes("nombre")[0].InnerText;
                        labels_llamado_especifico_carros[i].Text = carrosDespachados[i].SelectNodes("nombre")[0].InnerText;
                        labels_llamado_especifico_carros[i].Location = new System.Drawing.Point((i % 7) * 30 * resolucion, inicio);
                        labels_llamado_especifico_carros[i].Click += new System.EventHandler(this.muestraCarro);
                        labels_llamado_especifico_carros[i].Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular);
                        labels_llamado_especifico_carros[i].ForeColor = Color.Black;
                        this.panel_llamado_especifico.Controls.Add(labels_llamado_especifico_carros[i]);
                    }
                    pixel_final_llamado_especifico = inicio + 15 * resolucion;
                }
                else if (labels_llamado_especifico_carros.Length < cantidadCarros)
                {
                    this.panel_llamado_especifico.Controls.Clear();
                    this.panel_llamado_especifico.Controls.Add(this.boton_actualizar_llamado_especifico);
                    this.panel_llamado_especifico.Controls.Add(this.boton_actualizar_llamados);
                    for (int i = 0; i < 3; i++)
                        this.panel_llamado_especifico.Controls.Add(labels_llamado_especifico[i]);
                    labels_llamado_especifico_carros = new LinkLabel[cantidadCarros];
                    int inicio = 101 * resolucion;
                    for (int i = 0; i < cantidadCarros; i++)
                    {
                        /* Caben 7 por fila */
                        if (i % 7 == 0 && i != 0)
                            inicio += 15 * resolucion;
                        labels_llamado_especifico_carros[i] = new System.Windows.Forms.LinkLabel();
                        labels_llamado_especifico_carros[i].Size = new System.Drawing.Size(30 * resolucion, 15 * resolucion);
                        labels_llamado_especifico_carros[i].Name = carrosDespachados[i].SelectNodes("nombre")[0].InnerText;
                        labels_llamado_especifico_carros[i].Text = carrosDespachados[i].SelectNodes("nombre")[0].InnerText;
                        labels_llamado_especifico_carros[i].Location = new System.Drawing.Point((i % 7) * 30*resolucion, inicio);
                        labels_llamado_especifico_carros[i].Click += new System.EventHandler(this.muestraCarro);
                        labels_llamado_especifico_carros[i].Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular);
                        labels_llamado_especifico_carros[i].ForeColor = Color.Black;
                        this.panel_llamado_especifico.Controls.Add(labels_llamado_especifico_carros[i]);
                    }
                    pixel_final_llamado_especifico = inicio + 15*resolucion;
                }
                else
                {
                    int inicio = 101 * resolucion;
                    /* Si estamos aca habian label suficientes para agregar los carros */
                    this.panel_llamado_especifico.Controls.Clear();
                    this.panel_llamado_especifico.Controls.Add(this.boton_actualizar_llamado_especifico);
                    this.panel_llamado_especifico.Controls.Add(this.boton_actualizar_llamados);
                    for (int i = 0; i < 3; i++)
                        this.panel_llamado_especifico.Controls.Add(labels_llamado_especifico[i]);
                    for (int i = 0; i < labels_llamado_especifico_carros.Length; i++)
                        this.panel_llamado_especifico.Controls.Remove(labels_llamado_especifico_carros[i]);
                    for (int i = 0; i < cantidadCarros; i++)
                    {
                        /* Caben 7 por fila */
                        if (i % 7 == 0 && i != 0)
                            inicio += 15 * resolucion;
                        labels_llamado_especifico_carros[i].Name = carrosDespachados[i].SelectNodes("nombre")[0].InnerText;
                        labels_llamado_especifico_carros[i].Text = carrosDespachados[i].SelectNodes("nombre")[0].InnerText;
                        this.panel_llamado_especifico.Controls.Add(labels_llamado_especifico_carros[i]);
                    }
                    pixel_final_llamado_especifico = inicio + 15 * resolucion;
                }
                for (int i = 0; i < labels_llamado_especifico_carros.Length; i++)
                    labels_llamado_especifico_carros[i].BackColor = Color.White;
                this.panel_llamado_especifico.Show();
                this.panel_llamados.Hide();
                Cursor.Current = Cursors.Default;
        }
        private void muestraCarro(object sender, EventArgs e)
        {
            for (int i = 0; i < labels_llamado_especifico_carros.Length; i++)
                labels_llamado_especifico_carros[i].BackColor = Color.White;
            LinkLabel tmp = (LinkLabel)sender;
            tmp.BackColor = Color.LightGray;
            XmlNodeList carros = xdoc_llamado.SelectNodes("/carro");
                if (labels_llamado_especifico_estados == null)
                {
                    labels_llamado_especifico_estados = new Label[10];
                    for (int i = 0; i < 10; i++)
                    {
                        labels_llamado_especifico_estados[i] = new System.Windows.Forms.LinkLabel();
                        labels_llamado_especifico_estados[i].Size = new System.Drawing.Size(ancho, 15*resolucion);
                        labels_llamado_especifico_estados[i].Name = "Llamado" + i;
                        labels_llamado_especifico_estados[i].Location = new System.Drawing.Point(0, 3 + pixel_final_llamado_especifico + (15*resolucion * i));
                        labels_llamado_especifico_estados[i].Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular);
                        labels_llamado_especifico_estados[i].ForeColor = Color.Black;
                        this.panel_llamado_especifico.Controls.Add(labels_llamado_especifico_estados[i]);
                    }
                }
                else if (labels_llamado_especifico_estados[0].Location.Y != (pixel_final_llamado_especifico + 3))
                {
                    //MessageBox.Show("El Y estaba en otro lado");
                    for (int i = 0; i < 10; i++)
                    {
                        labels_llamado_especifico_estados[i].Location = new System.Drawing.Point(3, 3 + pixel_final_llamado_especifico + (15*resolucion * i));
                    }
                }
                for (int i = 0; i < 10; i++)
                {
                    //MessageBox.Show("Los dejo vacio");
                    labels_llamado_especifico_estados[i].Text = "";
                    this.panel_llamado_especifico.Controls.Remove(labels_llamado_especifico_estados[i]);
                }
                //Hashtable estadosCarro = new Hashtable();
                //for (int i = 0; i < carros.Count; i++){
                //    if (carros[i].SelectNodes("nombre")[0].InnerText == tmp.Name) {
                //        XmlNodeList estados = carros[i].SelectNodes("estado");
                //         for (int j = 0; j < estados.Count; j++){
                //             if (estados[i].SelectNodes("nombre")[0].InnerText == "6-0")
                //                 estadosCarro.Add(estados[i].SelectNodes("nombre")[0].InnerText, estados[i].SelectNodes("conforme")[0].InnerText);
                //             else
                //                 estadosCarro.Add(estados[i].SelectNodes("nombre")[0].InnerText, estados[i].SelectNodes("fecha")[0].InnerText + " " + estados[i].SelectNodes("hora")[0].InnerText);
                //        }
                //         break;
                //    }
                //}
                //MessageBox.Show("Buscamos el carro " + tmp.Name);
                for (int i = 0; i < carros.Count; i++)
                {
                    if (carros[i].SelectNodes("nombre")[0].InnerText == tmp.Name)
                    {
                        //MessageBox.Show("Encontre" + tmp.Name);
                        XmlNodeList estados = carros[i].SelectNodes("estado");
                        for (int j = 0; j < estados.Count; j++)
                        {
                            //MessageBox.Show("Estado :" + estados[j].SelectNodes("nombre")[0].InnerText + ".");
                            if (estados[j].SelectNodes("nombre")[0].InnerText=="6-0")
                                labels_llamado_especifico_estados[j].Text = estados[j].SelectNodes("nombre")[0].InnerText + " " + estados[j].SelectNodes("conforme")[0].InnerText;
                            else
                                labels_llamado_especifico_estados[j].Text = estados[j].SelectNodes("nombre")[0].InnerText + " " + estados[j].SelectNodes("fecha")[0].InnerText + " " + estados[j].SelectNodes("hora")[0].InnerText;
                            this.panel_llamado_especifico.Controls.Add(labels_llamado_especifico_estados[j]);
                        }
                        break;
                    }
                }

        }
        private void actualizaLlamado(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            this.boton_actualizar_llamado_especifico.Text = this.textos.valor("/mensajes/FormCarros/ActualizandoLlamado")+"...";
            Button tmp = (Button)sender;
            xdoc_llamado = null;
            try
            {
                XMLLlamadosLocal llamado = new XMLLlamadosLocal(this.url_servicio);
                xdoc_llamado = llamado.Llamado(tmp.Name);
            }
            catch (Exception)
            {
                xdoc_llamado = null;
            }
            if (xdoc_llamado == null)
            {
                Cursor.Current = Cursors.Default;
                return;
            }

            XmlNodeList carrosDespachados = xdoc_llamado.SelectNodes("/despachados/carro");
            int cantidadCarros = carrosDespachados.Count;
            /* Ahora nos preocopucamos de link label de los carros
             * Los carros no pueden ser nulos, se deben haber creado antes, tenemos que fijarnos
             * en la cantidad de carros
             */
            if (labels_llamado_especifico_carros.Length < cantidadCarros)
            {
                this.panel_llamado_especifico.Controls.Clear();
                this.panel_llamado_especifico.Controls.Add(this.boton_actualizar_llamado_especifico);
                this.panel_llamado_especifico.Controls.Add(this.boton_actualizar_llamados);

                labels_llamado_especifico_carros = new LinkLabel[cantidadCarros];
                int inicio = 91;
                for (int i = 0; i < cantidadCarros; i++)
                {
                    /* Caben 7 por fila */
                    if (i % 7 == 0 && i != 0)
                        inicio += 15;
                    labels_llamado_especifico_carros[i] = new System.Windows.Forms.LinkLabel();
                    labels_llamado_especifico_carros[i].Size = new System.Drawing.Size(20, 15);
                    labels_llamado_especifico_carros[i].Name = carrosDespachados[i].SelectNodes("nombre")[0].InnerText;
                    labels_llamado_especifico_carros[i].Text = carrosDespachados[i].SelectNodes("nombre")[0].InnerText;
                    labels_llamado_especifico_carros[i].Location = new System.Drawing.Point((i % 7) * 30, inicio);
                    labels_llamado_especifico_carros[i].Click += new System.EventHandler(this.muestraCarro);
                    labels_llamado_especifico_carros[i].Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular);
                    labels_llamado_especifico_carros[i].ForeColor = Color.Black;
                    this.panel_llamado_especifico.Controls.Add(labels_llamado_especifico_carros[i]);
                }
                pixel_final_llamado_especifico = inicio + 15;
            }
            else{
                for (int i = 0; i < cantidadCarros; i++)
                {

                    labels_llamado_especifico_carros[i].Name = carrosDespachados[i].SelectNodes("nombre")[0].InnerText;
                    labels_llamado_especifico_carros[i].Text = carrosDespachados[i].SelectNodes("nombre")[0].InnerText;
                }
            }
            this.boton_actualizar_llamado_especifico.Text = this.textos.valor("/mensajes/FormCarros/ActualizarLlamado");
            Cursor.Current = Cursors.Default;
        }
        private void tabChange(object sender, EventArgs e) {
            if (this.tab.SelectedIndex == 2 && labels_llamados == null) {
                actualizaLlamados(sender, e);
            }
            if (this.tab.SelectedIndex == 3 && labels_llamados == null)
            {
                actualizaArchivos(sender, e);
            }


        }
        [MTAThread]
        /*static void Main()
        {
            Application.Run(new FormMapa());
        }*/

        void startMicroServWeb()
        {

            string serverPath = config.getPathMicroServWeb();
            if (!File.Exists(serverPath))
            {
                this.notificacion.Caption = textos.valor("/mensajes/FormMapa/Error");
                this.notificacion.Text = textos.valor("/mensajes/FormMapa/ErrorMicroservidor");
                return;
            }
            serverProcess = new Process();
            serverProcess.StartInfo.FileName = serverPath;
            serverProcess.StartInfo.Arguments = "-A";
            try
            {
                serverProcess.Start();
            }
            catch (Exception ex)
            {
                serverProcess = null;
                this.notificacion.Caption = textos.valor("/mensajes/FormMapa/Error");
                this.notificacion.Text = textos.valor("/mensajes/FormMapa/ErrorMicroservidorNoInicio") +
                                serverProcess.StartInfo.FileName + " " + ex.Message;
                return;
            }
        }

        private void KeyDownHdlr(object sender, KeyEventArgs e)
        {
            //arp = abp = izp = dep = false;         
            if ((e.KeyCode == System.Windows.Forms.Keys.Up))
            {
                arp = true;
                //mapa.moveUp();
                //mapa.dibujar();
                //label1.Text = offsetX + " " + offsetY;

            }
            if ((e.KeyCode == System.Windows.Forms.Keys.Down))
            {
                abp = true;
                //label1.Text = offsetX + " " + offsetY;              
            }
            if ((e.KeyCode == System.Windows.Forms.Keys.Left))
            {
                izp = true;
                //label1.Text = offsetX + " " + offsetY;
            }
            if ((e.KeyCode == System.Windows.Forms.Keys.Right))
            {
                dep = true;
                //label1.Text = offsetX + " " + offsetY;
                // dibujar();
            }
            if ((e.KeyCode == System.Windows.Forms.Keys.Enter))
            {

            }

        }

        private void KeyUpHdlr(object sender, KeyEventArgs e)
        {
            if ((e.KeyCode == System.Windows.Forms.Keys.Up))
            {
                arp = false;
            }
            if ((e.KeyCode == System.Windows.Forms.Keys.Down))
            {
                abp = false;
            }
            if ((e.KeyCode == System.Windows.Forms.Keys.Left))
            {
                izp = false;
            }
            if ((e.KeyCode == System.Windows.Forms.Keys.Right))
            {
                dep = false;
            }
            if ((e.KeyCode == System.Windows.Forms.Keys.Enter))
            {
            }
        }

        void controlTeclas()
        {
            while (true)
            {
                //deb = "";
                if (arp)
                {
                    // deb += "U ";
                    mapa.moveUp();
                    //evitar el "efecto escalera"
                    if ((!(dep)) && (!(izp)))
                        mapa.dibujar();
                }
                if (abp)
                {
                    //deb += "D ";
                    mapa.moveDown();
                    //evitar el "efecto escalera"
                    if ((!(dep)) && (!(izp)))
                        mapa.dibujar();
                }
                if (izp)
                {
                    //deb += "L ";
                    mapa.moveLeft();
                    mapa.dibujar();
                }
                if (dep)
                {
                    //deb += "R ";
                    mapa.moveRight();
                    mapa.dibujar();
                }
                //DoUpdate(deb);
                Thread.Sleep(10); //entregar el procesador a otros threads                                                
            }
        }
        private void FormPocketEarth_Paint(object sender, PaintEventArgs e)
        {
            mapa.dibujar();
        }

        private void notificacion_listado(object obj, ResponseSubmittedEventArgs resevent)
        {
            int opcion = Convert.ToInt32(resevent.Response);
            if (opcion > PDIselected.Length)
                return;
            PuntoDeInteres selected = PDIselected[opcion];

            /*Modificacion 17-10-07 Vherskov*/
            //convertir coordenadas lat/long a UTM (para MOSTRAR)
            //TODO: 19H esta hard-coded aqui
            ConversionCoordenadas cc = new ConversionCoordenadas();
            String coordenadasUTM = cc.latLon2UTM(selected.Coordenadas.Latitud, selected.Coordenadas.Longitud);
            int segundoEspacio = coordenadasUTM.IndexOf(" ", coordenadasUTM.IndexOf(" ") + 1);
            coordenadasUTM = coordenadasUTM.Substring(segundoEspacio + 1); //este espacio norte
            String coordEste = coordenadasUTM.Substring(0, coordenadasUTM.IndexOf(" "));
            String coordNort = coordenadasUTM.Substring(coordenadasUTM.IndexOf(" ") + 1);
            StringBuilder HTMLString = new StringBuilder();
            if (selected.Nombre == "")
                this.notificacion.Caption = selected.Tipo;
            else
                this.notificacion.Caption = selected.Nombre;
            HTMLString.Append("<html><body><table>");
            HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/Direccion") + "</b></td><td>" + selected.Direccion + "</td></tr>");
            HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/Norte") + ":</b></td><td>" + coordNort + "</td></tr>");
            HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/Este") + ":</b></td><td>" + coordEste + "</td></tr>");
            HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/Descripcion") + ":</b></td></tr>");
            HTMLString.Append("<tr><td colspan=\"2\">" + selected.Descripcion + "</td></tr>");
            HTMLString.Append("</table></body></html>");
            this.notificacion.Text = HTMLString.ToString();
            this.notificacion.Visible = true;
            return;
        }
        //controla evento de presionar el stylus
        private void MouseDownHdlr(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            
            if (this.notificacion.Visible != true)
                mapa.centrarHome = false;
            this.notificacion.Visible = false;
            /* Ahora siempre estara en Modo Seleccion, a menos que sea Modo Distancia */
            //Buscar cercanos
            Point clickPoint = new Point(e.X, e.Y);
            /*string coordClick = mapa.getLatLongClickPantalla(clickPoint);
            MessageBox.Show(coordClick);
            */
            ArrayList res_puntos = mapa.obtenerPDIClick(clickPoint);
            List<string> res_carros = mapa.obtenerCarrosClick(clickPoint);
            PDIselected = new PuntoDeInteres[res_puntos.Count];
            res_puntos.CopyTo(PDIselected);
            /*Vemos si la suma de puntos y carros es mayor a 2, entonces es un listado*/
            int carros_puntos = res_carros.Count + res_puntos.Count;

            //---mostrar las notificiones sólo en caso de que el ZoomActual >= ZoomIniPAraMostrar
            //if (this.mapa.zoomActual >= this.mapa.ZoomIniParaMostrarPDI)
            //{

                if (carros_puntos > 1 && modo != Modo.Distancia)
                {
                    try
                    {
                        this.notificacion.Caption = textos.valor("/mensajes/FormMapa/Elija");
                        StringBuilder HTMLString = new StringBuilder();

                        HTMLString.Append("<html><body>");
                        for (int i = 0; i < res_puntos.Count; i++)
                        {
                            if (PDIselected[i].Nombre == "")
                                HTMLString.Append("<a href=\"" + i + "\">" + PDIselected[i].Direccion + "</a><br/>");
                            else
                                HTMLString.Append("<a href=\"" + i + "\">" + PDIselected[i].Nombre + "</a><br/>");
                        }
                        HTMLString.Append("</body></html>");
                        this.notificacion.Text = HTMLString.ToString();
                        this.notificacion.ResponseSubmitted += new ResponseSubmittedEventHandler(notificacion_listado);
                        this.notificacion.Visible = true;
                        return;
                    }
                    catch (Exception)
                    {
                        return;
                    }
                }
                else if (res_puntos.Count == 1 && modo != Modo.Distancia)
                {

                    try
                    {
                        PuntoDeInteres selected = PDIselected[0];
                        /*Modificacion 17-10-07 Vherskov*/
                        //convertir coordenadas lat/long a UTM (para MOSTRAR)
                        //TODO: 19H esta hard-coded aqui
                        ConversionCoordenadas cc = new ConversionCoordenadas();
                        String coordenadasUTM = cc.latLon2UTM(selected.Coordenadas.Latitud, selected.Coordenadas.Longitud);
                        int segundoEspacio = coordenadasUTM.IndexOf(" ", coordenadasUTM.IndexOf(" ") + 1);
                        coordenadasUTM = coordenadasUTM.Substring(segundoEspacio + 1); //este espacio norte
                        String coordEste = coordenadasUTM.Substring(0, coordenadasUTM.IndexOf(" "));
                        String coordNort = coordenadasUTM.Substring(coordenadasUTM.IndexOf(" ") + 1);
                        //fin modificacion
                        StringBuilder HTMLString = new StringBuilder();
                        if (selected.Nombre == "")
                            this.notificacion.Caption = selected.Tipo;
                        else
                            this.notificacion.Caption = selected.Nombre;
                        HTMLString.Append("<html><body><table>");
                        HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/Direccion") + ":</b></td><td>" + selected.Direccion + "</td></tr>");
                        HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/Norte") + ":</b></td><td>" + coordNort + "</td></tr>");
                        HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/Este") + ":</b></td><td>" + coordEste + "</td></tr>");
                        //HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/Descripcion") + "Detalle:</b></td></tr>");
                        HTMLString.Append("<tr><td colspan=\"2\">" + selected.Descripcion + "</td></tr>");
                        HTMLString.Append("</table></body></html>");
                        this.notificacion.Text = HTMLString.ToString();
                        this.notificacion.Visible = true;
                    }
                    catch (Exception)
                    {
                    }


                    return;
                }
                else if (res_carros.Count == 1 && modo != Modo.Distancia)
                {
                    try
                    {
                        Carro tmp_carro = obtenerCarro(res_carros[0]);
                        /*Modificacion 17-10-07 Vherskov*/
                        //convertir coordenadas lat/long a UTM (para MOSTRAR)
                        //TODO: 19H esta hard-coded aqui
                        ConversionCoordenadas cc = new ConversionCoordenadas();
                        String coordEste, coordNort;
                        if (tmp_carro.Posicion != null)
                        {
                            String coordenadasUTM = cc.latLon2UTM(tmp_carro.Posicion.Latitud, tmp_carro.Posicion.Longitud);
                            int segundoEspacio = coordenadasUTM.IndexOf(" ", coordenadasUTM.IndexOf(" ") + 1);
                            coordenadasUTM = coordenadasUTM.Substring(segundoEspacio + 1); //este espacio norte
                            coordEste = coordenadasUTM.Substring(0, coordenadasUTM.IndexOf(" "));
                            coordNort = coordenadasUTM.Substring(coordenadasUTM.IndexOf(" ") + 1);
                        }
                        else
                        {
                            coordEste = coordNort = "s/i";
                        }
                        //fin modificacion
                        StringBuilder HTMLString = new StringBuilder();
                        this.notificacion.Caption = tmp_carro.Nombre;
                        HTMLString.Append("<html><body><table>");
                        HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/ACargo") + ":</b></td><td>" + tmp_carro.Acargo + "</td></tr>");
                        HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/Norte") + ":</b></td><td>" + coordNort + "</td></tr>");
                        HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/Este") + ":</b></td><td>" + coordEste + "</td></tr>");
                        HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/Especialidad") + ":</b></td><td>" + tmp_carro.Especialidad + "</td></tr>");
                        HTMLString.Append("</table></body></html>");
                        this.notificacion.Text = HTMLString.ToString();
                        this.notificacion.Visible = true;
                    }
                    catch (Exception)
                    {
                    }
                    return;
                }
            //}//fin del if zoom
            
            else 
            {
                //MessageBox.Show("zoom="+this.mapa.zoomActual);
            }
                //md++;
            pressed = true;
            //label1.Text = "md "+md+" mu " + mu + " mm "+mm;

            if (modo == Modo.Desplazamiento || modo == Modo.destinationMode)
            {
                if (e.X > ancho - 150)
                {
                    dep = true;
                }
                if (e.X < 150)
                {
                    izp = true;
                }
                if (e.Y > alto - 150)
                {
                    abp = true;
                }
                if (e.Y < 150)
                {
                    arp = true;
                }
            }
            if (modo == Modo.Distancia)
            {
                label1.Visible = true;
                mapa.dibujarDistancia = true;
                mapa.p1 = new Point(e.X, e.Y);
            }

            /* Begin Pedro */
            if (modo == Modo.insertAreaMode)
            {
                polygonPoints.Push(mapa.getLatLongClickPantalla(new Point(e.X, e.Y)));

                //MessageBox.Show("X=" + e.X + "\nY=" + e.Y);

                if (polygonPoints.Count >= 3)
                {
                    menuItemFinish.Text = "Terminar";
                }

                mapa.dibujar();
            }
        }

        void MouseMoveHdlr(object sender, MouseEventArgs e)
        {
            if (!pressed) return;
            /*mm++;
            label1.Text = "md " + md + " mu " + mu + " mm " + mm;
            label1.Text = "al " + alto + " ancho " + ancho;*/
            dep = izp = abp = arp = false;
            if (modo == Modo.Desplazamiento || modo == Modo.destinationMode)
            {
                if (e.X > ancho - 150)
                {
                    dep = true;
                }
                if (e.X < 150)
                {
                    izp = true;
                }
                if (e.Y > alto - 150)
                {
                    abp = true;
                }
                if (e.Y < 150)
                {
                    arp = true;
                }
            }
            if (modo == Modo.Distancia)
            {
                mapa.p2 = new Point(e.X, e.Y);
                mapa.dibujar();
                string dist = mapa.dist;
                label1.Text = "" + dist;
            }
        }
        protected void gps_LocationChanged(object sender, LocationChangedEventArgs args)
        {
            position = args.Position;

            // call the UpdateData method via the updateDataHandler so that we
            // update the UI on the UI thread
            Invoke(GPSupdateDataHandler);

        }
        void gps_DeviceStateChanged(object sender, DeviceStateChangedEventArgs args)
        {
            device = args.DeviceState;

            // call the UpdateData method via the updateDataHandler so that we
            // update the UI on the UI thread
            Invoke(GPSupdateDataHandler);
        }
        void GPSUpdateData(object sender, System.EventArgs args)
        {
            try
            {
                if (gps.Opened)
                {
                    if (position != null)
                    {
                        if (position.LatitudeValid && position.LongitudeValid)
                        {

                            if (modo == Modo.destinationMode)
                            {
                                LatLong tmp = new LatLong(position.Latitude, position.Longitude);
                                if (mapa.centrarHome)
                                    mapa.irAcoordenadas(tmp);
                                mapa.actual(tmp);
                                mapa.setDestinationModeSource(tmp);
                                mapa.dibujar();
                                if (pediHome)
                                {
                                    pediHome = false;
                                    this.notificacion.Caption = textos.valor("/mensajes/FormMapa/MiPosicion");
                                    StringBuilder HTMLString = new StringBuilder();
                                    HTMLString.Append("<html><body><table>");
                                    HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/Latitud") + ":</b></td><td>" + position.LatitudeInDegreesMinutesSeconds.ToString() + "</td></tr>");
                                    HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/Longitud") + ":</b></td><td>" + position.LongitudeInDegreesMinutesSeconds.ToString() + "</td></tr>");
                                    HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/Faltan") + ":</b></td><td>" + mapa.distanciaDestino() + "</td></tr>");
                                    HTMLString.Append("</table></body></html>");
                                    this.notificacion.Text = HTMLString.ToString();
                                    this.notificacion.Visible = true;
                                }
                            }
                            else if (pediHome)
                            {
                                pediHome = false;
                                this.notificacion.Caption = textos.valor("/mensajes/FormMapa/MiPosicion");
                                StringBuilder HTMLString = new StringBuilder();
                                HTMLString.Append("<html><body><table>");
                                HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/Latitud") + ":</b></td><td>" + position.LatitudeInDegreesMinutesSeconds.ToString() + "</td></tr>");
                                HTMLString.Append("<tr><td><b>" + textos.valor("/mensajes/FormMapa/Longitud") + ":</b></td><td>" + position.LongitudeInDegreesMinutesSeconds.ToString() + "</td></tr>");
                                HTMLString.Append("</table></body></html>");
                                this.notificacion.Text = HTMLString.ToString();
                                this.notificacion.Visible = true;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                MessageBox.Show(ex.StackTrace);
            }
        }
        //controla el evento de soltar el stylus
        private void MouseUpHdlr(object sender, System.Windows.Forms.MouseEventArgs e)
        {

            pressed = false;
            /*mu++;
            label1.Text = "md " + md + " mu " + mu + " mm " + mm;*/
            if (modo == Modo.Desplazamiento || modo == Modo.destinationMode)
            {
                dep = false;
                izp = false;
                arp = false;
                abp = false;
            }

            if (modo == Modo.Distancia)
            {
                mapa.dibujarDistancia = false;
                mapa.dist = "0.0 Kms";
                this.label1.Visible = false;
            }

            if (modo == Modo.Insercion)
            {
                Point pointClick = new Point(e.X, e.Y);
                LatLong latlongClick = mapa.getLatLongClickPantalla(pointClick);
                if (position != null) {
                    if (position.LongitudeValid && position.LatitudeValid)
                        latlongClick = new LatLong(position.Latitude, position.Longitude);
                }
                FormAgregarPuntoDeInteres formAddPOI = new FormAgregarPuntoDeInteres(mapa.gruposPDI, latlongClick);
                DialogResult result = formAddPOI.ShowDialog();
                if (result == DialogResult.OK)
                {
                    Cursor.Current = Cursors.WaitCursor;
                    mapa.irAcoordenadas(latlongClick);
                    Cursor.Current = Cursors.Default;
                    return;
                }
                return;
            }
        }


        private void zoomOutHdlr(object sender, EventArgs e)
        {
            if (mapa.zoomActual > 0)
            {

                mapa.zoomOut();
                //Cursor.Current = Cursors.WaitCursor;                
                mapa.dibujar();
                //Cursor.Current = Cursors.Default;
            }
            else
            {
                this.notificacion.Caption = textos.valor("/mensajes/FormMapa/MaximoAlejamiento");
                this.notificacion.Text = textos.valor("/mensajes/FormMapa/MaximoAlejamiento");
            }

        }

        private void zoomInHdlr(object sender, EventArgs e)
        {
            if (mapa.zoomActual < mapa.niveles - 1)
            {
                mapa.zoomIn();
                mapa.dibujar();
            }
            else
            {
                this.notificacion.Caption = textos.valor("/mensajes/FormMapa/MaximoAcercamiento");
                this.notificacion.Text = textos.valor("/mensajes/FormMapa/MaximoAcercamiento");
            }

        }

        public void Anula()
        {
            izp = false; dep = false; arp = false; abp = false;
        }

        public void modoDesplazamiento(object sender, EventArgs e)
        {
            mapa.setModoText(textos.valor("/mensajes/FormMapa/Desplazamiento"));
            modo = Modo.Desplazamiento;
            mapa.modo_gp = Modo.Desplazamiento;
            mapa.dibujar();
        }
        private void Click_instertar_punto(object sender, EventArgs e)
        {
            modo = Modo.Insercion;
            mapa.setModoText(textos.valor("/mensajes/FormMapa/Insercion"));

        }

        private void modoDistancia(object sender, EventArgs e)
        {
            mapa.setModoText(textos.valor("/mensajes/FormMapa/Distancia"));
            modo = Modo.Distancia;
            mapa.dibujar();
        }

        public PuntoDeInteres getSelectedPOI(int index)
        {
            return PDIselected[index];
        }

        public void Ok_Click(int index, bool noSelection)
        {
            PuntoDeInteres selected = noSelection ? null : getSelectedPOI(index);
            if (selected == null)
            {
                return;
            }
            else
            {
                /*Modificacion 17-10-07 Vherskov*/
                //convertir coordenadas lat/long a UTM (para MOSTRAR)
                //TODO: 19H esta hard-coded aqui
                ConversionCoordenadas cc = new ConversionCoordenadas();
                String coordenadasUTM = cc.latLon2UTM(selected.Coordenadas.Latitud, selected.Coordenadas.Longitud);
                int segundoEspacio = coordenadasUTM.IndexOf(" ", coordenadasUTM.IndexOf(" ") + 1);
                coordenadasUTM = coordenadasUTM.Substring(segundoEspacio + 1); //este espacio norte
                String coordEste = coordenadasUTM.Substring(0, coordenadasUTM.IndexOf(" "));
                String coordNort = coordenadasUTM.Substring(coordenadasUTM.IndexOf(" ") + 1);
                //fin modificacion
                MessageBox.Show("Tipo: " + selected.Tipo + "\n" +
                                "Nombre: " + selected.Nombre + "\n" +
                                "Direccion: " + selected.Direccion + "\n" +
                                "Norte: " + coordNort + "\n" +
                                "Este: " + coordEste + "\n" +
                                "Descripcion: " + selected.Descripcion, "Punto de Interés");
                //POIselected = null;                
                return;
            }
        }


        private void seleccionLayers(object sender, EventArgs e)
        {
            FormLayers formLayers = new FormLayers(mapa.gruposPDI, mapa.grupoADI, textos);
            //pasar el control a la nueva ventana
            formLayers.ShowDialog();
            
            //mapa.RadioChecket = formLayers.RadioIsChecket;
            mapa.irAcoordenadas();
        }

        //private void menuItem2_Click(object sender, EventArgs e)
        //{
        //    FormCompartir formC = new FormCompartir(mapa.gruposPDI, config.getPathRecursos());
        //    formC.ShowDialog();
        //    mapa.irAcoordenadas();
        //}

        private void label4_ParentChanged(object sender, EventArgs e)
        {

        }

        /* begin g3 */

        private void modoDestino(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            /* Ahora le damos la URL para ver los distintos lugares donde puede ir 29-07-2008 amonares */
            FormSeleccionDestino fsd = new FormSeleccionDestino(this, this.config.url_servicio(), textos);
            Cursor.Current = Cursors.Default;
            fsd.ShowDialog();
            gps.Open();
        }

        public void SeleccionDestinoAceptarClick(String txtLatitud, String txtLongitud)
        {
            try
            {   
                destinationModeDestination = new LatLong(double.Parse(txtLatitud), double.Parse(txtLongitud));
                //destinationModeDestination = new LatLong(txtLatitud, txtLongitud);
                //destinationModeDestination = new LatLong(-33.469582, -70.576521);
                mapa.setDestinationParameters(destinationModeDestination);
                mapa.setModoText(textos.valor("/mensajes/FormMapa/Destino"));

                //---inicio
                //---dibujar los grifos más cercanos a esta emergencia
                //crear el nuevo formulario
                    Idioma idioma2 = new Idioma(config.Idioma()); 
                    FormLayers frmRadio2 = new FormLayers(mapa.gruposPDI, mapa.grupoADI, idioma2);

                    frmRadio2.Centro = new LatLong(txtLatitud,txtLongitud);
                    //copiar el ultimo destino en una variable global
                    FormPrincipal.ult_dest = destinationModeDestination;
                    frmRadio2.Radio = config.getRadioAccionPDI();
                    
                    frmRadio2.boxes[mapa.gruposPDI.Count+1].Checked = true;
                    
                    Object se2 = new object();
                    EventArgs ea2 = new EventArgs();
                    //click en seleccionar los PDI cercanos al radio
                    
                    frmRadio2.layerOK_Click(se2, ea2);
                    //le decimos se vaya a esa coordena y en el zoom adecuado
                    mapa.irAcoordenadas(destinationModeDestination);
                    //mapa.zoomActual = 5;
                    //mapa.dibujar();
                    
                ///---fin---
 
                initDestinationMode();
            }
            catch (FormatException)
            {
                this.notificacion.Caption = textos.valor("/mensajes/FormMapa/ErrorInfo");
                this.notificacion.Text = textos.valor("/mensajes/FormMapa/IngreseValorCorrecto");
            }
        }

        private void initDestinationMode()
        {
            gps.Open();
            Brush b = new SolidBrush(Color.Brown);
            Pen p = new Pen(Color.Black);
            mapa.initDestionationMode(0.025 * this.Size.Height, 0.1 * this.Size.Height, 0.025 * this.Size.Height, 0.05 * this.Size.Height, b, p);
            /* Just in case */
            mapa.setDestinationParameters(destinationModeDestination);

            /* End Pedro */

            modo = Modo.destinationMode;
            mapa.modo_gp = Modo.destinationMode;
            mapa.centrarHome = true;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (mapa.zoomActual > 0)
            {
                mapa.zoomOut();
                //Cursor.Current = Cursors.WaitCursor;                
                mapa.dibujar();
                //Cursor.Current = Cursors.Default;
            }
            else
            {
                this.notificacion.Caption = textos.valor("/mensajes/FormMapa/MaximoAlejamiento");
                this.notificacion.Text = textos.valor("/mensajes/FormMapa/MaximoAlejamiento");
            }
        }

        private void insertAreaModeClick(object sender, EventArgs e)
        {

            if (modo != Modo.insertAreaMode)
            {
                /* Enter and configure the mode */


                mapa.setModoText(textos.valor("/mensajes/FormMapa/Area"));

                //menuItemAdministrationMode.Enabled = false;
                //TODO: Massive Load
                //menuItemMassiveLoad.Enabled = false;



                /* Add some options */

                /* Clear the point stack */
                polygonPoints.Clear();
                /* Enter the mode */
                modo = Modo.insertAreaMode;
                mapa.modo_gp = Modo.insertAreaMode;
            }
            else
            {
                /* Exit and set displacement mode */

                //menuItemAdministrationMode.Enabled = true;
                //TODO: Massive Load
                //menuItemMassiveLoad.Enabled = true;

                /* Clear the point stack */
                polygonPoints.Clear();

                /* Exit the mode */
                modo = Modo.Desplazamiento;
                mapa.modo_gp = Modo.Desplazamiento;
                modo = Modo.Desplazamiento;

                this.label1.Visible = false;
                mapa.setModoText(textos.valor("/mensajes/FormMapa/Desplazamiento"));
                /* draw again, please */
                mapa.dibujar();

            }

        }

        private void insertAreaFinishClick(object sender, EventArgs e)
        {
            if (polygonPoints.Count < 3)
            {
                /* User cancelled */
                insertAreaModeClick(sender, e);
            }
            else
            {
                /* Area defined by the stack */
                menuItemFinish.Enabled = true;
                menuItemUndo.Enabled = false;

                FormAgregarArea faa = new FormAgregarArea(this);
                faa.ShowDialog();
            }
        }

        private void insertAreaUndoClick(object sender, EventArgs e)
        {
            if (polygonPoints.Count > 0)
            {
                polygonPoints.Pop();
                if (polygonPoints.Count < 3)
                {
                    menuItemFinish.Text = "Cancelar";
                }

                mapa.dibujar();
            }
        }

        public void insertAreaFromStack(string name, string type)
        {

            /* Save Area */
            AreaDeInteres ai = new AreaDeInteres(name, type);

            LatLong[] ll = polygonPoints.ToArray();

            for (int i = 0; i < ll.Length; ++i)
            {
                ai.addPunto(ll[i]);
            }

            /* Save area to disk */

            mapa.grupoADI.agregarAreaDeInteres(ai, true);
            mapa.updatePolygonList(mapa.getNW(), mapa.grupoADI);

            buttonInsertAreaCancel_Click(null, null);
        }

        public void buttonInsertAreaCancel_Click(object sender, EventArgs e)
        {

        }
        public int getX()
        {
            return mapa.rx;
        }
        public int getY()
        {
            return mapa.ry;

        }

        //  public void CloseHdlr(object sender, System.ComponentModel.CancelEventArgs e)
        //{
        // MessageBox.Show("Espero que esto funcione de una vez por todas");
        //Application.Exit();
        // }



        private void menuItemCargaMasiva_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog1 = new OpenFileDialog();

            openFileDialog1.InitialDirectory = "c:\\";
            openFileDialog1.Filter = "XML files (*.xml)|*.xml";
            openFileDialog1.FilterIndex = 1;
            //openFileDialog1.RestoreDirectory = true;
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    CargaMasiva.generateXMLs(openFileDialog1.FileName, "POI", "nombre", "tipo", mapa, config.getPathRecursos() + Path.DirectorySeparatorChar + "PuntosDeInteres");
                    CargaMasiva.generateXMLs(openFileDialog1.FileName, "Area", "nombre", "tipo", mapa, config.getPathRecursos() + Path.DirectorySeparatorChar + "AreasDeInteres");

                    /*actualizar los layers*/
                    foreach (GrupoPuntoDeInteres gpdi in mapa.gruposPDI)
                    {
                        gpdi.actualizar();
                    }


                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);

                }
            }
            Cursor.Current = Cursors.Default;
            mapa.dibujar();
        }

        public void home(object sender, EventArgs e)
        {
            if (modo == Modo.destinationMode)
                mapa.centrarHome = true;
            pediHome = true;
            gps.Open();

            if (modo == Modo.Desplazamiento)
            {
                LatLong tmp = new LatLong(lat_ini, lon_ini);
                mapa.zoomActual = 1;
                mapa.irAcoordenadas(tmp);
                mapa.actual(tmp);
                pediHome = true;
                mapa.dibujar();
            }
        }

        public void setDestino(string destino)
        {
            mapa.destino_texto = destino;
        }
        public Carro obtenerCarro(string nombre)
        {

            for (int i = 0; i < lista_carros.Count; i++)
                if (lista_carros[i].Nombre.ToLower().Equals(nombre.ToLower()))
                    return lista_carros[i];
            /* Si no retorno era que no lo tenia 
             * asi que lo pedimos
             */

            FactoryCarros factCar = new ConcreteCarros();
            XMLCarros carros = factCar.createCarros(this.url_servicio);

            //XMLCarros carros = new XMLCarros(this.config.url_servicio());
            XmlTextReader xmlCarro = carros.Carro(nombre);
            Carro q2;
            if (xmlCarro == null)
                return null;
            else
            {
                q2 = new Carro(xmlCarro);
                lista_carros.Add(q2);
                return q2;
            }
        }
        public void actualiza_carros()
        {
            List<LatLong> carros = new List<LatLong>();
            while (true)
            {
                try
                {
                    FactoryCoordenadas factCoord = new ConcreteCoordenadas();
                    XMLCoordenadas coord = factCoord.createCoordenadas(this.config.url_servicio());
                    //XMLCoordenadas coord = new XMLCoordenadas(this.config.url_servicio());
                    if (gps.Opened)
                    {
                        if (position.LatitudeValid && position.LongitudeValid)
                             carros = coord.CarrosActualiza(this.config.carro(),position.Latitude.ToString(),position.Longitude.ToString());
                    }
                    else
                    {
                        carros = coord.Carros();
                    }
                }
                catch (Exception)
                {
                    carros.Clear();
                }
                try
                {
                    if (carros.Count > 0)
                    {
                        mapa.Carros = carros;
                        mapa.dibujar();
                    }
                }
                catch (Exception)
                {
                    //MessageBox.Show("Error actualiza_carros " + ex.Message);
                }
                Thread.Sleep(10000);
            }
        }

        private void verCarros(object sender, EventArgs e)
        {
            //FormCarros tmp = new FormCarros(this.config.url_servicio(), this.textos);
           // tmp.ShowDialog();
        }

        private void notification1_ResponseSubmitted(object sender, ResponseSubmittedEventArgs e)
        {

        }
        private void clickBotonArchivo(object sender, EventArgs e)
        {
            //----falta implementar

        }


        //---implementar módulo de enviar foto al servidor
        private void clickBotonFoto(object sender, EventArgs e)
        {
            //implementado en otro boton
        }

        private void buFilename_Click(object sender, EventArgs e)
        {
            
        }



        private string GetCameraCaptureDialogTitle(CameraCaptureDialog dlg)
        {
            if (dlg.Mode == CameraCaptureMode.Still)
            {
                return string.Format("{0} [{1}]", dlg.Title, "Photo");
            }
            else
            {
                return string.Format("{0} [{1}]", dlg.Title, "Video");
            }
        }
        [DllImport("coredll.dll", SetLastError = true)]
        public static extern IntPtr DestroyWindow(IntPtr hWnd);

        [DllImport("coredll.dll", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        public static IntPtr FindWindow(string windowTitle)
        {
            return FindWindow(null, windowTitle);
        }

        private void clickArchivosTab(object sender, EventArgs e)
        {
            this.notificacion.Visible = false;
        }

        private void buRefresh_Click(object sender, EventArgs e)
        {
            RefrescarImagen();
        }

        private void RefrescarImagen() 
        {
        if (listBox1.SelectedIndex != -1)
            {

                string curFile = this.localPath + listBox1.Items[listBox1.SelectedIndex].ToString();

                if (!File.Exists(curFile))
                {//hay que traer del servidor
                    DownloadFile(listBox1.Items[listBox1.SelectedIndex].ToString());
                }

                //tenemos la imagen
                myImg = new System.Drawing.Bitmap(curFile);
                //ajustar el tamano de la imagen
                this.pictureBox1.Width = Convert.ToInt32(myImg.Width * 0.25);
                this.pictureBox1.Height = Convert.ToInt32(myImg.Height * 0.25);
                this.zoomFoto = 1;
                this.buZoomMas.Enabled = true;
                this.buZoomMenos.Enabled = true;
                //this.pictureBox1.Width = this.tabArchivos.Width-60;
                this.pictureBox1.Image = myImg;
                //pictureBox1.ImageLocation = curFile;
                pictureBox1.Refresh();

            }
            else
            {//mensaje 

                MessageBox.Show("No hay archivos...");
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {

        }

        private void buDownload_Click_1(object sender, EventArgs e)
        {

        }

        private void buLista_Click(object sender, EventArgs e)
        {
            ListarArchivos();
        }


        private void ListarArchivos()
        {

        try
            {
                listBox1.Items.Clear();
                
                //invocar al web service que lista los archivos
                MapaMovil.CentralFotos.Emergencia archivosCentral = new MapaMovil.CentralFotos.Emergencia(this.url_servicio);
                
                string listaFotos;
                try
                {
                    listaFotos = archivosCentral.ListFilesOfEmergency(this.emergActual,this.imageDirectory);
                }
                catch 
                {
                    try
                    {
                        listaFotos = archivosCentral.ListFilesOfEmergency(this.emergActual, this.imageDirectory);
                    }
                    catch (Exception err)
                    {
                        listaFotos = "" ;
                        
                    }

                }
                
                if (listaFotos.CompareTo("") == 0)
                {
                    //MessageBox.Show("no se pudo recuperar las imagenes ... razon desconocida");
                }
                else
                {
                    //agregar al list box, el nombre de los archivos (de string a listbox)
                    int inicio;
                    inicio = 0;
                    int posicionN;
                    while (listaFotos.IndexOf("\n", inicio) != -1)
                    {
                        posicionN = listaFotos.IndexOf("\n", inicio);
                        string archivo = listaFotos.Substring(inicio, posicionN - inicio);
                        listBox1.Items.Add(archivo);
                        inicio = posicionN + 1;

                    }
                    if (listBox1.Items.Count > 0)
                    {
                        listBox1.SelectedIndex = 0;
                    }
                }
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.Message);
            }
            
        }

        private void buDownload_Click(object sender, EventArgs e)
        {
            //listar archivos
            ListarArchivos();

            //Refrescar imagen
            RefrescarImagen();
            //descargar archivo
            //verificar que se selecciono un item
            if (this.listBox1.SelectedIndex != -1)
            {
                //descargar archivo

                string fileName = this.listBox1.Items[this.listBox1.SelectedIndex].ToString();
                Cursor.Current = Cursors.WaitCursor;
                //invocar al metodo
                bool ret = DownloadFile(fileName);
                if (ret)
                {
                    this.notificacion.Caption = "Recepción de archivo";
                    this.notificacion.Text = "El archivo se descargó correctamente!";
                    this.notificacion.Visible = true;
                    //MessageBox.Show("el archivo se descargó correctamente");

                    Cursor.Current = Cursors.Default;
                }
                else
                {
                    //MessageBox.Show("eror al trasnferir el archivo");
                    this.notificacion.Caption = "Recepción de archivo";
                    this.notificacion.Text = "Error al descargar el archivo...";
                    this.notificacion.Visible = true;

                    Cursor.Current = Cursors.Default;
                }
            }
            else
            {
                //MessageBox.Show("Debe seleccione un archivo");

            }
        }


        //---sub modulo para descargar un archivo
        private bool DownloadFile(string archivo)
        {
            
            byte[] arch; 
            try
            {
                //invocar al webservice para descargar el archivo
                MapaMovil.CentralFotos.Emergencia cli = new MapaMovil.CentralFotos.Emergencia(this.url_servicio);
                try
                {
                    arch = cli.DownloadFile(archivo, this.imageDirectory);
                }
                catch 
                {
                    try
                    {
                        arch = cli.DownloadFile(archivo, this.imageDirectory);
                    }
                    catch (Exception err)
                    {
                        MessageBox.Show(err.Message);
                        arch = null;
                        return false;

                    }
                }

                if (arch != null)
                {
                    //escribir los bytes en el archivo
                    string folderPath = this.localPath;
                    FileStream fs = new FileStream(folderPath + "\\" + archivo, FileMode.Create);
                    fs.Write(arch, 0, arch.Length);
                    fs.Close();
                    Cursor.Current = Cursors.Default;
                }
                return true;
                

            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.Message);
                return false;
            }
        }

        private void buRefresh_Click_1(object sender, EventArgs e)
        {

        }

        private void buUpload_Click(object sender, EventArgs e)
        {
            //invocar a la API de la camara
            CameraCaptureDialog cameraCaptureDialog = new CameraCaptureDialog();
            cameraCaptureDialog.Owner=this;
            cameraCaptureDialog.Title = "Enviar Fotografía";
            string windowTitle = GetCameraCaptureDialogTitle(cameraCaptureDialog);
            cameraCaptureDialog.Mode = CameraCaptureMode.Still;
            cameraCaptureDialog.StillQuality = CameraCaptureStillQuality.Normal;

            DialogResult dr = cameraCaptureDialog.ShowDialog();
            if (dr == DialogResult.OK)
            {
                
                //textBox1.Text = openFileDialog1.FileName.ToString();// filepath;
                try
                {
                    //string filepath = openFileDialog1.FileName.ToString();
                    string filepath = cameraCaptureDialog.FileName.ToString();
                    //MessageBox.Show("entrando");
                    //string fileNameToUpload = openFileDialog1.SafeFileName.ToString();
                    int lt = filepath.Length;
                    int li = filepath.LastIndexOf("\\") + 1;
                    string fileNameToUpload = filepath.Substring(li, lt - li);
                    //MessageBox.Show("saliendo");
                    string pathToUpload = filepath.Substring(0, filepath.Length - fileNameToUpload.Length);

                    Cursor.Current = Cursors.WaitCursor;
                    if (UploadFile(pathToUpload, fileNameToUpload))
                    {
                        
                        this.notificacion.Caption = "Envio de fotografía";
                        this.notificacion.Text = "El envio de la fotografía ha tenido exito!.";
                        this.notificacion.Visible = true;

                        Cursor.Current = Cursors.Default;
                        //MessageBox.Show("Archivo cargado correctamente en el servidor", "Carga exitosa");
                    }
                    else
                    {
                        this.notificacion.Caption = "Envio de fotografía";
                        this.notificacion.Text = "No se pudo enviar la foto....";
                        this.notificacion.Visible = true;
                        Cursor.Current = Cursors.Default;
                        //MessageBox.Show("Hubo un error en la carga del archivo, intente más tarde", "Error");
                    }
                }
                catch (Exception err)
                {
                    Cursor.Current = Cursors.Default;
                    MessageBox.Show(err.Message);
                }


            }

            cameraCaptureDialog.Dispose();
            IntPtr ptr = FindWindow(windowTitle);
            if (ptr != IntPtr.Zero)
            {
                DestroyWindow(ptr);
            }

        }

        //---modulo para subir un archivo al servidor
        private bool UploadFile(string pathCamara, string archivoNombreCamara)
        {
            //convertir el archivo a un arreglo de Bytes
            FileStream fs = new FileStream(pathCamara + archivoNombreCamara, FileMode.Open);
            byte[] bytes = new byte[fs.Length];

            fs.Read(bytes, 0, System.Convert.ToInt32(fs.Length));
            fs.Close();

            //cambiar de nombre de la foto
            string archivoNombreCorrecto;
            archivoNombreCorrecto = generarFileName();
            MessageBox.Show(archivoNombreCorrecto);
            //invocar al webservice para enviar el archivo
            MapaMovil.CentralFotos.Emergencia envioFoto = new MapaMovil.CentralFotos.Emergencia(this.url_servicio);

            bool ret;
            
            try
            {
                ret = envioFoto.UploadFile(bytes, archivoNombreCorrecto, this.imageDirectory);
            }
            catch 
            {
                try
                {
                    ret = envioFoto.UploadFile(bytes, archivoNombreCorrecto, this.imageDirectory);
                }
                catch
                {   
                    ret = false;
                    return ret;
                }


            }

            if (ret)
            {
                //como ya está en el servidor, entonces los guardamos en la máquina local con el nombre asignado
                //string fileName = 
                string sourcePath = pathCamara;
                string targetPath = this.localPath;
                // Use Path class to manipulate file and directory paths.
                string sourceFile = System.IO.Path.Combine(sourcePath, archivoNombreCamara);
                string destFile = System.IO.Path.Combine(targetPath, archivoNombreCorrecto);

                System.IO.File.Copy(sourceFile, destFile, true);

                //actualizar la lista de archivos
                ListarArchivos();

                return true;
            }
            else
            {//parece que esta parte esta por demas, porque el catch anterior ya retorno false.
                return false;
            }
        }

        //---generar el nombre de un archivo en base codigo de emergencia y hora actual
        private string generarFileName()
        {
            string strEmergencia;

            string strHora;
            string strMinuto;
            string strSegundo;
            string strExtension;

            //obtener la emergencia actual

            strEmergencia = this.emergActual;
            

            strExtension = ".jpg";

            DateTime getFechaHoraActual = DateTime.Now;

            strHora = String.Format("{0:HH}", getFechaHoraActual);
            strMinuto = String.Format("{0:mm}", getFechaHoraActual);
            strSegundo = String.Format("{0:ss}", getFechaHoraActual);

            return strEmergencia + "_" + strHora + strMinuto + strSegundo + strExtension;
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            RefrescarImagen();
        }

        public void actualizaArchivos(object sender, EventArgs e) 
        {
            int nroArchivosServidor;
            //seleccionar número  de fotos del servidor
            MapaMovil.CentralFotos.Emergencia servEmerg = new MapaMovil.CentralFotos.Emergencia(this.url_servicio);
            try
            {
                nroArchivosServidor= Int32.Parse(servEmerg.CountFilesOfEmergency(this.emergActual, this.imageDirectory));

            }
            catch (Exception err){
                nroArchivosServidor=0;
                MessageBox.Show(err.Message);
            }

            
            //seleccionar número de fotos local
            int nroArchivosLocal;
            ///=====Falta implementar


            //nroFotosPorDescargar = nroArchivosServidor - nroArchivosLocal;
            //seleccionar las fotos del directorio local
            //buDownload.Text = buDownload.Text + "("+nroFotosPorDescargar.ToString()+")";

        }

        private void tab_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.tab.SelectedIndex == 3)
            {
                int nroFotosPorDescargar = 2;
                buDownload.Text = buDownload.Text;
            }
        }

        public string EmergActual
        {
            get { return this.emergActual; }
            set { this.emergActual = value; }
        }

        private void buZoomMas_Click(object sender, EventArgs e)
        {
            if (zoomFoto < 4)
            {
                this.pictureBox1.Width = Convert.ToInt32(pictureBox1.Width+ myImg.Width* 0.25);
                this.pictureBox1.Height = Convert.ToInt32(pictureBox1.Height + myImg.Height * 0.25);
                

                //pictureBox1.Width = pictureBox1.Width + 50;
                //pictureBox1.Height = pictureBox1.Height + 50;
                zoomFoto++;
                //trackBar1.Value++;
                buZoomMas.Enabled = true;
                buZoomMenos.Enabled = true;
            }
            else
            {
                buZoomMas.Enabled = false;
            }
        }

        private void buZoomMenos_Click(object sender, EventArgs e)
        {
            if (zoomFoto > 1)
            {
                this.pictureBox1.Width = Convert.ToInt32(pictureBox1.Width - myImg.Width * 0.25);
                this.pictureBox1.Height = Convert.ToInt32(pictureBox1.Height - myImg.Height * 0.25);
                zoomFoto--;
                buZoomMenos.Enabled = true;
                buZoomMas.Enabled = true;
            }
            else
            {
                buZoomMenos.Enabled = false;
            }
        }

        private void cbbRecibirFoto_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void ListarArchivosCombo()
        {


        }

        private void RefrescarImagenCombo()
        {
        }

        private void cbbRecibirFoto_GotFocus(object sender, EventArgs e)
        {


        }

        private void trackBar1_ValueChanged(object sender, EventArgs e)
        {
            
        }

        private void button3_Click_1(object sender, EventArgs e)
        {
            myImg = pictureBox1.Image;
            this.pictureBox1.Width = Convert.ToInt32(myImg.Width * 0.25);
            this.pictureBox1.Height = Convert.ToInt32(myImg.Height * 0.25);
            buZoomMenos.Enabled = true;
            buZoomMas.Enabled = true;
        }
       


    }
}